package models

import (
	"encoding/json"
	"testing"
	"time"
)

// BaseModel 所有model都应该要包含这个, 后面数据库操作要用到
type BaseModel struct {
	//CreateDate time.Time `bson:"createDate"   json:"createDate"`
	ID string `bson:"id,omitempty"  json:"id,omitempty"`
}

// 处理
type PageModel struct {
	Page     int `json:"page"`
	Pagesize int `json:"pagesize"`
}

//=======通用业务模型=====

// 排序用 参数为两个要交换排序的object参数
type GeneralSort struct {
	ID1   string `json:"id1"`
	Sort1 int64  `json:"sort1"`
	ID2   string `json:"id2"`
	Sort2 int64  `json:"sort2"`
	Col   string `json:"col"` //表/集合 名称
}

// 扩充时间方法, 在格式化为json的时候输出字符串格式
type FTime time.Time

const (
	timeFormart = "2006-01-02 15:04:05"
)

// json字符串转对象
func (t *FTime) UnmarshalJSON(data []byte) (err error) {
	now, err := time.ParseInLocation(`"`+timeFormart+`"`, string(data), time.Local)
	*t = FTime(now)
	return
}

// 对象转成json字符串
func (t FTime) MarshalJSON() ([]byte, error) {
	b := make([]byte, 0, len(timeFormart)+2)
	b = append(b, '"')
	b = time.Time(t).AppendFormat(b, timeFormart)
	b = append(b, '"')
	return b, nil
}

func (t FTime) String() string {
	return time.Time(t).Format(timeFormart)
}

func ToString(t time.Time) string {
	return t.Format(timeFormart)
}

type Person struct {
	Id       int64  `json:"id"`
	Name     string `json:"name"`
	Birthday FTime  `json:"birthday"`
}

func TestTimeJson(t *testing.T) {
	now := FTime(time.Now())
	t.Log(now)
	src := `{"id":5,"name":"xiaoming","birthday":"2016-06-30 16:09:51"}`
	p := new(Person)
	err := json.Unmarshal([]byte(src), p)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(p)
	t.Log(time.Time(p.Birthday))
	js, _ := json.Marshal(p)
	t.Log(string(js))
}
